package goft

import (
	"fmt"
	"reflect"
	"strings"
)

type Annotation interface {
	SetTag(tag reflect.StructTag)
	String() string
}

var AnnotationList []Annotation

/**
IsAnnotation 是否注解
*/
func IsAnnotation(p reflect.Type) bool {
	//根据反射类型判断是否 注解
	for _, item := range AnnotationList {
		if reflect.TypeOf(item) == p {
			return true
		}
	}
	return false
}

/**
Value 值注解
*/
type Value struct {
	Tag         reflect.StructTag //反射结构体tag
	BeanFactory *BeanFactory      //工厂
}

func (v *Value) SetTag(tag reflect.StructTag) {
	v.Tag = tag
}

func (v *Value) String() string {
	//定义 获取系统配置需带 config
	tag := v.Tag.Get("config")
	if tag == "" {
		return ""
	}
	//层级处理  示例:user.name
	prefix := strings.Split(tag, ".")
	//获取SysConfig 然后调用GetConfigValue 获取配置
	if config := v.BeanFactory.GetBean(new(SysConfig)); config != nil {
		get_value := GetConfigValue(config.(*SysConfig).Config, prefix, 0)
		if get_value != nil {
			return fmt.Sprintf("%v", get_value)
		}
	}
	return ""
}
